# -*- coding: utf-8 -*-
"""
    extensions.py
    ~~~~~~~~~~~~~~~~~~~~~
    文件描述：xfree扩展模块。
    作者：xfree。
    邮箱：cy_83k@qq.com。
"""

from celery import Celery
from flask_alembic import Alembic
from flask_allows import Allows
from flask_babelplus import Babel
from flask_caching import Cache
from flask_debugtoolbar import DebugToolbarExtension
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
from flask_login import LoginManager
from flask_mail import Mail
from flask_redis import FlaskRedis
from flask_sqlalchemy import SQLAlchemy
from flask_themes2 import Themes
from flask_whooshee import Whooshee
from flask_wtf.csrf import CSRFProtect
from sqlalchemy import MetaData

from xfree.utils.exceptions import AuthorizationRequired

# 创建权限管理器实例，当权限检查不通过时抛出 AuthorizationRequired 异常
allows = Allows(throws=AuthorizationRequired)

# 数据库相关设置
metadata = MetaData(
    naming_convention={
        "ix": "ix_%(column_0_label)s",  # 索引命名约定
        "uq": "uq_%(table_name)s_%(column_0_name)s",  # 唯一约束命名约定
        "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",  # 外键命名约定
        "pk": "pk_%(table_name)s",  # 主键命名约定
    }
)
# 创建 SQLAlchemy 实例，并传入自定义的元数据
db = SQLAlchemy(metadata=metadata, session_options={"future": True})

# Whooshee（全文搜索工具）实例
whooshee = Whooshee()

# 用户登录管理实例
login_manager = LoginManager()

# 邮件发送实例
mail = Mail()

# 缓存实例
cache = Cache()

# Redis 连接实例
redis_store = FlaskRedis()

# 调试工具栏实例
debugtoolbar = DebugToolbarExtension()

# 数据库迁移工具实例
alembic = Alembic()

# 主题管理实例
themes = Themes()

# 国际化和本地化工具实例
babel = Babel()

# CSRF 保护实例
csrf = CSRFProtect()

# 速率限制实例，自动检查设为 False，使用获取远程地址的函数作为键生成函数
limiter = Limiter(auto_check=False, key_func=get_remote_address)

# Celery 任务队列实例，并指定名称为“xfree”
celery = Celery("xfree")